<?php

/**
 * php 函数
 */

// 声明
function foo(): string
{
    return 'foo';
}

// 调用
echo foo();
echo PHP_EOL;


// 传参、默认值
function foo1($input = 0, $arr = [1, 2], $null = null)
{
    return $input;
}

// 可变参数
function foo4(...$nums): array
{
    return $nums;
}

print_r(foo4(1, 2, 3, 4));
echo PHP_EOL;


// 闭包函数
$foo = function ($name) {
    return 'callback ' . $name;
};

echo $foo('test') . PHP_EOL;

$message = 'aaa';
$foo = function () use ($message) {
    return 'callback use ' . $message;
};

echo $foo() . PHP_EOL;


// call_user_func_array 应用场景
// 动态调用普通函数时，比如参数和调用方法名称不确定的时候很好用
function say()
{
    $args = func_get_args();
    return call_user_func_array($args['0'], $args);
}

function sayChinese($name = '', $content = '')
{
    return $name . $content;
}

function sayEnglish($name = '', $content = '', $country = '')
{
    return $name . $content . $country;
}

function sayRasia($name = '')
{
    return $name;
}

echo say('sayChinese', '我是', '中国人') . PHP_EOL;
echo say('sayEnglish', 'I am', 'chinese') . PHP_EOL;
echo say('sayRasia', 'I am rasia') . PHP_EOL;

class S
{
    public function __construct()
    {

    }

    public static function say1($word)
    {
        echo 'say1 ' . $word;
    }

    public function say2($word)
    {
        echo 'say2 ' . $word;
    }
}

/*使用方式一：无需实例化调用类的静态方法*/
// call_user_func_array(array('S', 'say1'), array('Hello PHP'));
/*使用方式二：不实例化调用类的非静态方法*/
// call_user_func_array(array('S', 'say2'), array('Hello PHP'));
/*这里不会对自动实例化类，如果调用的方法中有$this语句，会报错，一般不这么用*/

/*使用方式三：实例化后调用类的非静态方法*/
// $s = new S();
// call_user_func_array(array($s, 'say2'), array('Hello PHP'));
// call_user_func_array(array(new S(), 'say2'), array('Hello PHP'));


// 递归

/**
 * 实现 n！的阶乘  公式  n! = n * (n-1)!
 * 简单理解 意思是把逐一减小的自然数序列相乘 比如 4！= 4*3*2*1
 */
function factorial($n)
{
    if ($n == 1) {
        return 1;
    }

    return $n * factorial($n - 1);
}

function factorial_show($n)
{
    if ($n == 1) {
        return 1;
    }

    return $n . '*' . factorial_show($n - 1);
}

// echo '1 的阶乘 '. factorial(1) . PHP_EOL;
echo '4 的阶乘 ' . factorial(4) . ' 计算过程 ' . factorial_show(4) . PHP_EOL;